﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IDbObject.h"
#include "ElementId.h"
#include "RegenDataId.h"


namespace gcmp
{
    class IElement;
    class IDocument;
    class UniIdentity;
    class IType;

    /// \brief 元素基础信息模块
    class GCMP_MODEL_INTERFACE_EXPORT IElementBasicInformation : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IElementBasicInformation, gcmp::IDbObject);
        
    public:
        /// \brief 获得元素所属文档
        /// \return IDocument* 文档指针
        virtual IDocument* GetDocument() const = 0;

        /// \brief 设置该行为所属Element
        /// \param pOwnerElement 所属Element
        /// \return bool
        virtual bool SetOwnerElement(IElement* pOwnerElement) = 0;

        /// \brief 获得该行为所属的Element
        /// \return 所属的Element
        virtual IElement* GetOwnerElement() const = 0;

        /// \brief 获得元素的Id
        /// \return ElementId 元素的Id
        virtual ElementId GetElementId() const = 0;

        /// \brief 获得元素所属类别的Uid
        /// \return const UniIdentity& 元素所属类别的Uid
        virtual const UniIdentity& GetCategoryUid() const = 0;

        /// \brief 设置元素所属类别的Uid
        /// \param uid 类别Uid
        /// \return bool 设置成功返回true，否则返回false。
        virtual bool SetCategoryUid(const UniIdentity& uid) = 0;

        /// \brief 获取元素实现类别的Uid，实现类代表各种具体的Instance，例如结构墙等
        ///
        /// \return const UniIdentity& 元素实现类别的Uid
        virtual const UniIdentity& GetImplementationUid() const = 0;

        /// \brief 设置元素实现类别的Uid
        ///
        /// \param const UniIdentity& 实现类别Uid
        /// \return bool 设置成功返回true, 否则返回false。
        virtual bool SetImplementationUid(const UniIdentity& uid) = 0;

        /// \brief 获得元素用于分类的唯一Uid
        /// \return const UniIdentity& 元素用于分类的唯一Uid
        virtual const UniIdentity& GetClassficationUid() const = 0;

        /// \brief 设置元素用于分类的唯一Uid
        /// \param uid 类别Uid
        /// \return bool 设置成功返回true，否则返回false。
        virtual void SetClassificationUid(const UniIdentity& guid) = 0;

        /// \brief 获得元素是否是临时元素
        /// \return bool 返回true表示是临时元素，false为非临时元素。
        virtual bool GetIsTransient() const = 0;

        /// \brief 获得元素名称
        /// \return const std::wstring& 元素名称
        virtual const std::wstring& GetName() const = 0;

        /// \brief 设置元素名称
        /// \param name 元素名称
        /// \return bool 设置成功返回true，否则返回false。
        virtual bool SetName(const std::wstring& name) = 0;

        /// \brief 获取Name的RdId
        ///
        /// \return 返回Name的关联更新数据标识
        virtual RegenDataId GetNameRdId() const = 0;

        /// \brief 对Name的变化进行标记并传播影响
        ///
        /// \return void
        virtual void MarkNameRdId() = 0;

        /// \brief 获得元素的ElementUid, 该ElementUid全局唯一
        /// \return const UniIdentity& 元素所属ElementUid
        virtual const UniIdentity& GetElementUid() const = 0;

        /// \brief 设置元素的ElementUid
        /// \param elementUid 元素的ElementUid
        /// \return bool 设置成功返回true，否则返回false。
        virtual bool SetElementUid(const UniIdentity& elementUid) = 0;

        /// \brief 获得元素类型Id
        /// \return const ElementId& 元素类型Id
        virtual const ElementId& GetTypeId() const = 0;

        /// \brief 设置元素类型Id
        /// \param typeId 元素类型Id
        /// \return bool 设置成功返回true，否则返回false。
        virtual bool SetTypeId(const ElementId& typeId) = 0;

        /// \brief 获得元素类型
        /// \return IType* 元素类型
        virtual IType* GetType() const = 0;

        /// \brief 设置默认的类型名
        /// \param typeName 类型名
        /// \return bool 设置成功返回true，否则返回false。
        virtual bool SetDefaultTypeName(const std::wstring& typeName) = 0;

        /// \brief 获得默认的类型名
        /// \return 默认的类型名
        virtual const std::wstring& GetDefaultTypeName() const = 0;

        /// \brief 获得元素对象是否唯一
        /// \return bool 返回true表示唯一，返回false表示不唯一。
        virtual bool IsUnique() const = 0;

        /// \brief 获得元素类型Id的关联更新数据
        /// \return RegenDataId 元素类型Id的关联更新数据
        virtual RegenDataId GetTypeIdRdId() const = 0;

        /// \brief 设置元素所属专业
        ///
        /// 不设置默认为{{49FEC72C-FA25-409C-8569-A52223039954}, L"GcmpInternal"}专业，用户对自己的专业创建的元素需要设置所属专业
        /// \param guid 所属专业Guid
        /// \return bool 设置成功返回true，否则返回false。
        virtual bool SetModuleGroup(const GUID& guid) = 0;

        /// \brief 获得元素所属专业Guid
        /// \return const wstring& 获得的元素所属专业
        virtual const Guid& GetModuleGroupGuid() const = 0;

        /// \brief 是否正在创建过程
        /// \return true-yes;false-no
        virtual bool IsCreating() const = 0;
    };
}
